#include "mywin.h"

// ==============================
// 全局变量定义
// ==============================

// 主界面对象定义
lv_obj_t *home_screen = NULL;
lv_obj_t *admin_screen = NULL;
lv_obj_t *album_screen = NULL;

// 窗口管理变量定义
lv_obj_t *current_win = NULL;

// 设备窗口全局变量定义
lv_obj_t *img_cl = NULL;
int int_cl = 0;

// ==============================
// 模块初始化函数
// ==============================

/**
 * @brief MyWin模块初始化函数
 * 
 * 初始化MyWin模块的所有组件，但不显示任何界面
 * 需要在LVGL初始化完成后调用
 */
void mywin_module_init(void)
{
    printf("Initializing MyWin Module...\n"); // 输出模块初始化信息
    
    // 初始化窗口样式
    mywin_init_styles(); // 调用窗口样式初始化函数
    
    // 初始化相册播放样式
    album_play_init_styles(); // 调用相册样式初始化函数
    
    printf("MyWin Module Initialization Complete.\n"); // 输出完成信息
}

/**
 * @brief MyWin模块清理函数
 * 
 * 清理MyWin模块占用的资源，在程序退出或模块卸载时调用
 * 确保所有动态分配的内存和资源被正确释放
 */
void mywin_module_cleanup(void)
{
    printf("Cleaning up MyWin Module...\n"); // 输出清理信息
    
    // 清理相册资源
    album_cleanup(); // 清理相册相关定时器和状态
    
    // 清理幻灯片资源
    slideshow_cleanup(); // 清理幻灯片相关定时器和状态
    
    // 删除所有界面对象
    if(home_screen) { // 检查主界面是否存在
        lv_obj_del(home_screen); // 删除主界面对象
        home_screen = NULL; // 重置指针
        printf("Home screen cleaned up.\n"); // 输出清理信息
    }
    
    if(admin_screen) { // 检查管理界面是否存在
        lv_obj_del(admin_screen); // 删除管理界面对象
        admin_screen = NULL; // 重置指针
        printf("Admin screen cleaned up.\n"); // 输出清理信息
    }
    
    if(album_screen) { // 检查相册界面是否存在
        lv_obj_del(album_screen); // 删除相册界面对象
        album_screen = NULL; // 重置指针
        printf("Album screen cleaned up.\n"); // 输出清理信息
    }
    
    // 清理当前窗口
    if(current_win) { // 检查当前窗口是否存在
        lv_obj_del(current_win); // 删除当前窗口对象
        current_win = NULL; // 重置指针
        printf("Current window cleaned up.\n"); // 输出清理信息
    }
    
    printf("MyWin Module Cleanup Complete.\n"); // 输出完成信息
}

// ==============================
// 应用程序状态查询函数
// ==============================

/**
 * @brief 获取应用程序当前状态信息
 * 
 * 用于调试和监控应用程序运行状态
 * 返回当前各个界面和窗口的状态信息
 */
void get_app_status(void)
{
    printf("=== MyWin Application Status ===\n"); // 输出状态标题
    
    // 界面状态
    printf("Home Screen: %s\n", home_screen ? "Active" : "Inactive"); // 主界面状态
    printf("Album Screen: %s\n", album_screen ? "Active" : "Inactive"); // 相册界面状态
    printf("Admin Screen: %s\n", admin_screen ? "Active" : "Inactive"); // 管理界面状态
    
    // 窗口状态
    printf("Current Window: %s\n", current_win ? "Open" : "Closed"); // 当前窗口状态
    if(current_win) { // 如果窗口存在
        printf("Window Pointer: %p\n", current_win); // 输出窗口指针
    }
    
    // 相册播放状态
    printf("Album Timer: %s\n", timer ? "Running" : "Stopped"); // 相册定时器状态
    printf("Slideshow Timer: %s\n", timer1 ? "Running" : "Stopped"); // 幻灯片定时器状态
    printf("Timer Paused: %s\n", isTimerPaused ? "Yes" : "No"); // 定时器暂停状态
    
    printf("=== End of Status ===\n"); // 输出状态结束标记
}

// ==============================
// 界面切换控制函数
// ==============================

/**
 * @brief 切换到主界面
 * 
 * 清理当前界面并显示主界面
 * 用于程序内部界面切换控制
 */
void switch_to_home(void)
{
    printf("Switching to home interface...\n"); // 输出切换信息
    
    // 清理当前可能存在的界面
    if(album_screen) { // 如果相册界面存在
        album_cleanup(); // 清理相册资源
        lv_obj_del(album_screen); // 删除相册界面
        album_screen = NULL; // 重置指针
    }
    
    if(admin_screen) { // 如果管理界面存在
        lv_obj_del(admin_screen); // 删除管理界面
        admin_screen = NULL; // 重置指针
    }
    
    // 显示主界面
    show_home_win(); // 创建并显示主界面
    printf("Switched to home interface successfully.\n"); // 输出成功信息
}

/**
 * @brief 切换到相册界面
 * 
 * 清理当前界面并显示相册界面
 * 用于程序内部界面切换控制
 */
void switch_to_album(void)
{
    printf("Switching to album interface...\n"); // 输出切换信息
    
    // 清理当前可能存在的界面
    if(home_screen) { // 如果主界面存在
        slideshow_cleanup(); // 清理幻灯片资源
        lv_obj_del(home_screen); // 删除主界面
        home_screen = NULL; // 重置指针
    }
    
    if(admin_screen) { // 如果管理界面存在
        lv_obj_del(admin_screen); // 删除管理界面
        admin_screen = NULL; // 重置指针
    }
    
    // 显示相册界面
    show_album_win(); // 创建并显示相册界面
    printf("Switched to album interface successfully.\n"); // 输出成功信息
}

/**
 * @brief 切换到管理界面
 * 
 * 清理当前界面并显示管理界面
 * 用于程序内部界面切换控制
 */
void switch_to_admin(void)
{
    printf("Switching to admin interface...\n"); // 输出切换信息
    
    // 清理当前可能存在的界面
    if(home_screen) { // 如果主界面存在
        slideshow_cleanup(); // 清理幻灯片资源
        lv_obj_del(home_screen); // 删除主界面
        home_screen = NULL; // 重置指针
    }
    
    if(album_screen) { // 如果相册界面存在
        album_cleanup(); // 清理相册资源
        lv_obj_del(album_screen); // 删除相册界面
        album_screen = NULL; // 重置指针
    }
    
    // 显示管理界面
    show_admin_win(); // 创建并显示管理界面
    printf("Switched to admin interface successfully.\n"); // 输出成功信息
}

// ==============================
// 设备控制便捷函数
// ==============================

/**
 * @brief 打开台灯控制窗口
 * 
 * 便捷函数，用于直接打开台灯控制窗口
 * 封装了窗口存在性检查和创建逻辑
 */
void open_lamp_control(void)
{
    printf("Opening lamp control window...\n"); // 输出打开信息
    
    if(current_win) { // 如果已有窗口存在
        printf("Moving existing window to foreground.\n"); // 输出前置信息
        lv_obj_move_foreground(current_win); // 将现有窗口前置
        return; // 直接返回
    }
    
    current_win = create_lamp_window(lv_scr_act()); // 创建新的台灯窗口
    printf("Lamp control window opened: %p\n", current_win); // 输出窗口指针
}

/**
 * @brief 打开空调控制窗口
 * 
 * 便捷函数，用于直接打开空调控制窗口
 * 封装了窗口存在性检查和创建逻辑
 */
void open_air_control(void)
{
    printf("Opening air control window...\n"); // 输出打开信息
    
    if(current_win) { // 如果已有窗口存在
        printf("Moving existing window to foreground.\n"); // 输出前置信息
        lv_obj_move_foreground(current_win); // 将现有窗口前置
        return; // 直接返回
    }
    
    current_win = create_air_window(lv_scr_act()); // 创建新的空调窗口
    printf("Air control window opened: %p\n", current_win); // 输出窗口指针
}

/**
 * @brief 打开窗帘控制窗口
 * 
 * 便捷函数，用于直接打开窗帘控制窗口
 * 封装了窗口存在性检查和创建逻辑
 */
void open_curtain_control(void)
{
    printf("Opening curtain control window...\n"); // 输出打开信息
    
    if(current_win) { // 如果已有窗口存在
        printf("Moving existing window to foreground.\n"); // 输出前置信息
        lv_obj_move_foreground(current_win); // 将现有窗口前置
        return; // 直接返回
    }
    
    current_win = create_curtain_window(lv_scr_act()); // 创建新的窗帘窗口
    printf("Curtain control window opened: %p\n", current_win); // 输出窗口指针
}

/**
 * @brief 打开智能灯控制窗口
 * 
 * 便捷函数，用于直接打开智能灯控制窗口
 * 封装了窗口存在性检查和创建逻辑
 */
void open_smart_lamp_control(void)
{
    printf("Opening smart lamp control window...\n"); // 输出打开信息
    
    if(current_win) { // 如果已有窗口存在
        printf("Moving existing window to foreground.\n"); // 输出前置信息
        lv_obj_move_foreground(current_win); // 将现有窗口前置
        return; // 直接返回
    }
    
    current_win = create_smart_lamp_window(lv_scr_act()); // 创建新的智能灯窗口
    printf("Smart lamp control window opened: %p\n", current_win); // 输出窗口指针
}

/**
 * @brief 关闭当前设备窗口
 * 
 * 便捷函数，用于关闭当前打开的设备控制窗口
 * 封装了窗口删除和状态重置逻辑
 */
void close_current_window(void)
{
    if(current_win) { // 如果当前窗口存在
        printf("Closing current window: %p\n", current_win); // 输出关闭信息
        lv_obj_del(current_win); // 删除窗口对象
        current_win = NULL; // 重置当前窗口指针
        printf("Window closed successfully.\n"); // 输出成功信息
    } else { // 如果没有窗口打开
        printf("No window is currently open.\n"); // 输出提示信息
    }
}

// ==============================
// 模块测试函数
// ==============================

/**
 * @brief 测试所有设备窗口创建功能
 * 
 * 用于开发和调试阶段测试各个设备窗口的创建和显示
 * 在实际应用中不需要调用此函数
 */
void test_all_device_windows(void)
{
    printf("Testing all device windows...\n"); // 输出测试开始信息
    
    // 测试台灯窗口
    lv_obj_t *lamp_win = create_lamp_window(lv_scr_act()); // 创建台灯窗口
    printf("Lamp window created: %p\n", lamp_win); // 输出窗口指针
    lv_obj_del(lamp_win); // 删除测试窗口
    printf("Lamp window test passed.\n"); // 输出测试通过信息
    
    // 测试空调窗口
    lv_obj_t *air_win = create_air_window(lv_scr_act()); // 创建空调窗口
    printf("Air window created: %p\n", air_win); // 输出窗口指针
    lv_obj_del(air_win); // 删除测试窗口
    printf("Air window test passed.\n"); // 输出测试通过信息
    
    // 测试窗帘窗口
    lv_obj_t *curtain_win = create_curtain_window(lv_scr_act()); // 创建窗帘窗口
    printf("Curtain window created: %p\n", curtain_win); // 输出窗口指针
    lv_obj_del(curtain_win); // 删除测试窗口
    printf("Curtain window test passed.\n"); // 输出测试通过信息
    
    // 测试智能灯窗口
    lv_obj_t *smart_lamp_win = create_smart_lamp_window(lv_scr_act()); // 创建智能灯窗口
    printf("Smart lamp window created: %p\n", smart_lamp_win); // 输出窗口指针
    lv_obj_del(smart_lamp_win); // 删除测试窗口
    printf("Smart lamp window test passed.\n"); // 输出测试通过信息
    
    printf("All device window tests completed successfully.\n"); // 输出测试完成信息
}

/**
 * @brief 测试所有界面显示功能
 * 
 * 用于开发和调试阶段测试各个界面的创建和显示
 * 在实际应用中不需要调用此函数
 */
void test_all_interfaces(void)
{
    printf("Testing all interfaces...\n"); // 输出测试开始信息
    
    // 测试主界面
    show_home_win(); // 显示主界面
    printf("Home interface displayed.\n"); // 输出显示信息
    lv_obj_del(home_screen); // 删除测试界面
    home_screen = NULL; // 重置指针
    printf("Home interface test passed.\n"); // 输出测试通过信息
    
    // 测试相册界面
    show_album_win(); // 显示相册界面
    printf("Album interface displayed.\n"); // 输出显示信息
    lv_obj_del(album_screen); // 删除测试界面
    album_screen = NULL; // 重置指针
    printf("Album interface test passed.\n"); // 输出测试通过信息
    
    // 测试管理界面
    show_admin_win(); // 显示管理界面
    printf("Admin interface displayed.\n"); // 输出显示信息
    lv_obj_del(admin_screen); // 删除测试界面
    admin_screen = NULL; // 重置指针
    printf("Admin interface test passed.\n"); // 输出测试通过信息
    
    printf("All interface tests completed successfully.\n"); // 输出测试完成信息
}